﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using CapaLogica.CL.PeriodoLectivo;
using CapaLogica.CL.Usuario;
using CapaLogica.CL.UtilidadesGenerales;


namespace CapaLogica.CL.Grupo
{
    public class GestorGrupo
    {
        /// <summary>
        /// Método de la clase encargada de insertar un nuevo curso en la BD
        /// </summary>
        /// <param name="pIdCurso">Codigo del Curso, tipo int</param>
        /// <param name="pNumGrupo">Numero de grupo, tipo int</param>
        /// <param name="pProfesores">Arreglo con los ids de los profesores, tipo ArrayList</param>
        /// <param name="pUsuario">Usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        public static void crearGrupo(int pIdCurso,int pNumGrupo, List<int> pProfesores)
        {
            try
            {
                int idUsuario = Session.Id;
                CL_Grupo grupo = new CL_Grupo(pIdCurso, pNumGrupo);
                GrupoPersistente persistenteGrupo = new GrupoPersistente();
                PeriodoPersistente persistentePeriodo = new PeriodoPersistente();

                CL_PeriodoLectivo periodo = persistentePeriodo.obtenerPeriodoActual();
                if (periodo != null)
                {
                    persistenteGrupo.insertarGrupo(grupo, pProfesores, periodo.Id, idUsuario);
                }
                else
                {
                    throw new Exception("No se puede abrir un grupo si no hay un Periodo Lectivo Abierto.");
                }
                    
            }
            catch (Exception ex)
            {

                throw ex;
            }
            
        }






        /// <summary>
        /// Método encargado de conseguir todos los datos de un grupo, menos la lista de profesores.
        /// </summary>
        /// <param name="pIdGrupo">Codigo del Grupo, tipo int</param>
        /// <remarks></remarks>
        public static Dictionary<String, Object> consultarGrupo(int pIdGrupo)
        {
            try 
	        {
                Dictionary<String, Object> datosGrupo = new Dictionary<string, Object>();
		        GrupoPersistente persistenteGrupo = new GrupoPersistente();
                CL_Grupo grupo = persistenteGrupo.buscarGrupoPorId(pIdGrupo);

                if (grupo != null)
                {
                    datosGrupo.Add("id", grupo.Id);
                    datosGrupo.Add("numGrupo", grupo.NumGrupo+"");
                    datosGrupo.Add("curso", grupo.Curso.nombre);

                    return datosGrupo;
                }
                else
                {
                    throw new Exception("No se ha encontrado ningun grupo con ese id.");
                }
	        }
	        catch (Exception ex)
	        {
		
		        throw ex;
	        }
            
        }



        /// <summary>
        /// Método de la clase encargada de cambiar los profesores de un grupo
        /// </summary>
        /// <param name="pIdGrupo">pIdGrupo, tipo int</param>
        /// <param name="pIdsAp">Ids de los profesores seleccionados, tipo List</int></param>
        /// <param name="pUsuario">Usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        public static void modificarGrupo(int pIdGrupo, List<int> pIdsProfesoresAp, int pNumGrupo)
        {
            try
            {
                Boolean modificar = false;
                int idUsuario = Session.Id;
                GrupoPersistente persistenteGrupo = new GrupoPersistente();
                UsuarioPersistente persistenteUsuario = new UsuarioPersistente();
                List<int> idsBD = persistenteUsuario.buscarIdsProfesoresDeGrupo(pIdGrupo);

                CL_Grupo grupo = persistenteGrupo.buscarGrupoPorId(pIdGrupo);
                
                if (grupo.NumGrupo != pNumGrupo)
                {
                    modificar = true;
                    grupo.NumGrupo = pNumGrupo;
                }
                persistenteGrupo.modificarGrupo(grupo, pIdsProfesoresAp, idsBD, idUsuario, modificar);
            
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }




        /// <summary>
        /// Método de la clase encargada de listar los grupos de un profesor
        /// </summary>
        /// <param name="pIdGrupo">pIdGrupo, tipo int</param>
        /// <param name="pIdsAp">Ids de los profesores seleccionados, tipo List</int></param>
        /// <param name="pUsuario">Usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        public static List<Informacion> listarGruposProfesor(int pIdProfesor)
        {
            GrupoPersistente persistenteGrupo = new GrupoPersistente();
            List<CL_Grupo> grupos = persistenteGrupo.buscarGruposProfesor(pIdProfesor);
            List<Informacion> datosGrupos = new List<Informacion>();

            if (grupos.Count != 0)
            {
                foreach (CL_Grupo grupo in grupos)
                {
                    EsGrupo temp = new EsGrupo(grupo.Id + "", grupo.NumGrupo + "", grupo.Curso.nombre, "");
                    datosGrupos.Add(temp);
                }

            }

            return datosGrupos;
        }



        /// <summary>
        /// Método de la clase encargada de listar los grupos de un estudiante
        /// </summary>
        /// <param name="pIdGrupo">pIdGrupo, tipo int</param>
        /// <remarks></remarks>
        public static List<Informacion> listarGruposEstudiante(int pIdEstudiante)
        {
            GrupoPersistente persistenteGrupo = new GrupoPersistente();
            List<CL_Grupo> grupos = persistenteGrupo.buscarGruposEstudiante(pIdEstudiante);
            List<Informacion> datosGrupos = new List<Informacion>();

            if (grupos.Count !=0)
            {
                foreach (CL_Grupo grupo in grupos)
                {
                    EsGrupo temp = new EsGrupo(grupo.Id + "", grupo.NumGrupo + "", grupo.Curso.nombre, "");
                    datosGrupos.Add(temp);
                }

                
            }

            return datosGrupos;
        }


        /// <summary>
        /// Método de la clase encargada de modificar una nueva Carrera a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo de la Carrera, tipo String</param>
        /// <param name="pnombre">Nombre de la Carrera, tipo String</param>
        /// <param name="pdescripcion">Descripcion de la carrera, tipo String</param>
        /// <param name="pestado">Estado de la carrera, tipo Byte</param>
        /// <remarks></remarks>
        public static List<EsGrupo> buscarGrupo(int pidCarrera, int pidCurso)
        {
            try
            {
                GrupoPersistente persistenteGrupo = new GrupoPersistente();
                List<EsGrupo> listaGrupos = persistenteGrupo.buscarGrupo(pidCarrera, pidCurso);
                return listaGrupos;
            }
            catch (Exception)
            {
                throw;
            }

        }



        /// <summary>
        /// Método de la clase encargada de listar los grupos de un curso
        /// </summary>
        /// <param name="pIdGrupo">pIdGrupo, tipo int</param>
        /// <param name="pIdsAp">Ids de los profesores seleccionados, tipo List</int></param>
        /// <param name="pUsuario">Usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        public static List<Informacion> listarGruposCurso(int pIdCurso)
        {
            GrupoPersistente persistenteGrupo = new GrupoPersistente();
            List<CL_Grupo> grupos = persistenteGrupo.listarGruposDeCurso(pIdCurso);
            List<Informacion> datosGrupos = new List<Informacion>();

            if (grupos.Count == 0)
            {
                throw new Exception("No hay grupos registrados para ese curso.");
            }

            if (grupos.Count != 0)
            {
                foreach (CL_Grupo grupo in grupos)
                {
                    EsGrupo temp = new EsGrupo(grupo.Id + "", grupo.NumGrupo + "", grupo.Curso.nombre, "");
                    datosGrupos.Add(temp);
                }

                
            }

            return datosGrupos;
        }



        /// <summary>
        /// Método de la clase encargada de eliminar una nueva Carrera a la DB 
        /// </summary>
        /// <param name="pcodigoCurso">Codigo de la Carrera, tipo String</param>
        /// <param name="pnombre">Nombre de la Carrera, tipo String</param>
        /// <param name="pdescripcion">Descripcion de la carrera, tipo String</param>
        /// <param name="pestado">Estado de la carrera, tipo Byte</param>
        /// <remarks></remarks>
        public static String eliminarGrupo(int pidGrupo)
        {
            try
            {

                GrupoPersistente _GrupoPersist = new GrupoPersistente();

                _GrupoPersist.eliminarGrupo(pidGrupo, Session.Id);

                return "¡El grupo ha sido eliminado!";

            }
            catch (Exception ex)
            {

                return ex.Message;
            }


        }



        /// <summary>
        /// Método de la clase encargo de matricular un estudiante a varios grupos.
        /// </summary>
        /// <param name="pIdEstudiante">Estudiante que se va a matricular, tipo int</param>
        /// <param name="pGrupos">Arreglos con los ids de los grupos, tipo ArrayList</param>
        /// <param name="pUsuario">Usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        public static void matricularEstudiante(int pIdEstudinte, List<int> pGrupos)
        {
            try
            {
                int idUsuario = Session.Id;
                GrupoPersistente persis = new GrupoPersistente();
                persis.asociarGrupoConEstudiante(pIdEstudinte, pGrupos, idUsuario);

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }




        public static void modificarMatriculaEstudiante(int pIdEstudiante, List<int> pIdsAp)
        {
            try
            {
                int idUsuario = Session.Id;
                GrupoPersistente persis = new GrupoPersistente();
                List<int> IdsBD = persis.buscarIdsGrupoEstudiante(pIdEstudiante);
                persis.modificarAsociacionGruposEstudiante(pIdEstudiante, pIdsAp, IdsBD, idUsuario);
            }
            catch (Exception ex)
            {

                throw ex;
            }


        }
    }
}
